package demo1;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:张熳
 * Date:2025-08-24
 * Time:17:56
 */
//多态
//向上转型和 向下转型(instanceof) + 重写

public class Test {
    public static void eat(Animal animal){
        //编译器在编译代码时，并不知道要调用的是Dog还是Bird中的eat方法，
        //等程序运行起来后，形参animal引用的具体对象确定后，才知道调用哪个方法
        //注意：此处的形参类型必须是父类类型才可以
        animal.eat();
    }
    public static void main(String[] args) {
        //理解什么是多态
        Dog dog = new Dog("小狗",2);
        Bird bird = new Bird("小鸟",1);

        eat(dog);
        eat(bird);

        /*Animal animal1 = new Bird("鸟儿",3);
        animal1.eat();*/
    }
    public static void main3(String[] args) {
        //instanceof
        Animal animal = new Dog("狗狗",2);
        //animal 这个引用 是否引用了 Bird这个对象
        if (animal instanceof Bird){
            Bird bird = (Bird) animal;
            bird.fly();
        }else {
            System.out.println("animal instanceof Bird not!");
        }
    }
    public static void main2(String[] args) {
        //向下转型
        Animal animal = new Dog("小狗",1);

        //((Dog) animal).bark();//直接转换

        Dog dog = (Dog) animal;//或者转换后赋值给Dog类对象，然后通过dog对象访问
        dog.bark();
        System.out.println("========");
        Animal animal1 = new Bird("小鸟",2);
        Dog dog1 = (Dog) animal1;//错误
    }
    //3.作返回值：返回任意子类对象
    public static Animal func2(){
        Dog dog = new Dog("旺财",3);
        return dog;
    }
    //2.方法传参：形参为父类型引用，可以接收任意子类的对象
    public static void func(Animal animal){

    }
    public static void main1(String[] args) {
        //向上转型 - 创建一个子类对象，将其当成父类对象来使用

        /*Dog dog = new Dog("小狗",2);
        Animal animal = dog;*/

        Animal animal = new Dog("小狗",2);//1.直接赋值：子类对象赋值给父类对象

        Bird bird = new Bird("小鸟",1);
        func(bird);

        Animal animal1 = func2();
        //animal1.bark();//父类Animal中并没有bark这个方法，这个方法是Dog类的
        animal1.eat();//只能调用父类中有的方法
    }
}
